Data Preparation: Gas
Stations
The gas station data set was used for the first part of this
analysis. In the gas station data set, there are 72798 observations of
32 variables. Some variables include: state, county, address,
coordinates, description, address, and point of compromise (POC).
Using this data set, a new data set was created by randomly selecting
500 observations. The resulting data set was 500 observations of all 32
variables.
gas <- read.csv(file="https://isarenn.github.io/irennenberg/Week7/POC.csv") #reading in the dataset from githbub
gas2 <-gas[sample(nrow(gas), size=500),] #Getting a random sample
Gas Stations:
Interactive Map
Using the R Map Library, the following interactive map of the gas
station data was created. The pop ups include:
- State
- County
- Address
- Zip Code
label.msg<-paste(paste("State", gas2$STATE), paste("County", gas2$county),
paste("Address", gas2$ADDRESS), paste("Zip", gas2$ZIPnew))
# making static leaflet map
leaflet(gas2) %>%
addTiles() %>%
setView(lng=mean(gas2$xcoord), lat=mean(gas2$ycoord), zoom = 14) %>%
addRectangles(
lng1 = min(gas2$xcoord), lat1 = min(gas2$ycoord),
lng2 = max(gas2$xcoord), lat2 = max(gas2$ycoord),
fillColor = "transparent"
) %>%
fitBounds(
lng1 = min(gas2$xcoord), lat1 = min(gas2$ycoord),
lng2 = max(gas2$xcoord), lat2 = max(gas2$ycoord) ) %>%
addMarkers(~xcoord, ~ycoord, label = ~label.msg)
Data Prepartion:
Philadelphia Crime Data
Another data set was used: Philly Crime data. This data set shows
longitudinal crime cases since 2014. There are 15520 observations and 18
variables in this dataset.
From this data set, the year was extracted from the date and a new
variable “year” was created.
Additionally, a subset was made with only 2023 data.
crime <- read.csv(file="https://isarenn.github.io/irennenberg/Week7/PhillyCrimeSince2015.csv") #reading in the dataset from githbub
crime$year <- format(as.Date(crime$date, format="%m/%d/%Y %H:%M"), "%Y")
d2023crime <- crime %>%
filter(year=='2023')
Philadelphia Crime:
Interactive Map
Using the above data set, the following map was created to plot crime
locations. Different colors were used to label fatal and non fatal
crimes.
The hover included the following information:
- Sex
- Fatality?
- Neighborhood
- Race
- Date
- Police District
map_options <- list(
scope = 'usa',
projection = list(type = 'regular usa'),
showlakes = TRUE,
lakecolor = toRGB('white')
)
###
plot_geo(d2023crime, lat = ~lat, lon = ~lng) %>%
add_markers( text = ~paste(sex, fatal, neighborhood, race, date,
paste("Police District:", police_district),
sep = "<br>"),
color = ~fatal,
symbol = "circle",
hoverinfo = "text") %>%
colorbar(title = "Fatality<br>2011.2") %>%
layout( title = 'Philadelphia Crime 2023', geo=list(
scope = 'usa',
center=list(lat=39.952583, lon=-75.165222),
projection = list(scale = 300)
)
)
From the map, we can see that the majority of crimes were non fatal.
We can also see that there were very many crimes in 2023.The crimes are
clustered in the center-most portion of the city, and are less condensed
the farther away from the center you go.
Thank you!
LS0tDQp0aXRsZTogIlZpc3VhbGl6aW5nIFNwYXRpYWwgSW5mb3JtYXRpb24iDQphdXRob3I6ICJJc2FiZWxsZSBSZW5uZW5iZXJnIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDogDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgdG9jX2NvbGxhcHNlZDogdHJ1ZQ0KICAgIHRvY19kZXB0aDogNA0KICAgIHRoZW1lOiAic3BhY2VsYWIiDQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgICAgDQogICAgDQotLS0gIA0KDQoNCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoNCmgxLnRpdGxlIHsNCiAgZm9udC1zaXplOiAzOHB4Ow0KICBjb2xvcjogIzAwMDBGRjsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDQuYXV0aG9yIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogIzQxYjZjNDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDEgew0KICAgIGZvbnQtc2l6ZTogMjJweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogIzQxYjZjNDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KPC9zdHlsZT4NCg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCiMgY29kZSBjaHVuayBzcGVjaWZpZXMgd2hldGhlciB0aGUgUiBjb2RlLCB3YXJuaW5ncywgYW5kIG91dHB1dCANCiMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGVzLg0KaWYgKCFyZXF1aXJlKCJ0aWR5dmVyc2UiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikNCiAgIGxpYnJhcnkodGlkeXZlcnNlKQ0KfQ0KaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpDQogICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJwbG90bHkiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygicGxvdGx5IikNCiAgIGxpYnJhcnkocGxvdGx5KQ0KfQ0KaWYgKCFyZXF1aXJlKCJnYXBtaW5kZXIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiZ2FwbWluZGVyIikNCiAgIGxpYnJhcnkoZ2FwbWluZGVyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJSQ3VybCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiUkN1cmwiKSAgICAgICAgICAgICAjIEluc3RhbGwgUkN1cmwgcGFja2FnZQ0KICAgIGxpYnJhcnkoIlJDdXJsIikNCn0NCmlmICghcmVxdWlyZSgiY29sb3VycGlja2VyIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJjb2xvdXJwaWNrZXIiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiY29sb3VycGlja2VyIikNCn0NCmlmICghcmVxdWlyZSgiZ2dhbmltYXRlIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJnZ2FuaW1hdGUiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiZ2dhbmltYXRlIikNCn0NCmlmICghcmVxdWlyZSgiZ2lmc2tpIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJnaWZza2kiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiZ2lmc2tpIikNCn0NCmlmICghcmVxdWlyZSgibWFnaWNrIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJtYWdpY2siKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgibWFnaWNrIikNCn0NCmlmICghcmVxdWlyZSgiZ3JEZXZpY2VzIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJnckRldmljZXMiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiZ3JEZXZpY2VzIikNCn0NCmlmICghcmVxdWlyZSgibGVhZmxldCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibGVhZmxldCIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJsZWFmbGV0IikNCn0NCmlmICghcmVxdWlyZSgibWFwcyIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibWFwcyIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJtYXBzIikNCn0NCmlmICghcmVxdWlyZSgiaHRtbHRvb2xzIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJodG1sdG9vbHMiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiaHRtbHRvb2xzIikNCn0NCmlmICghcmVxdWlyZSgiaHRtbHdpZGdldHMiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImh0bWx3aWRnZXRzIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImh0bWx3aWRnZXRzIikNCn0NCmlmICghcmVxdWlyZSgibGVhZmxlZ2VuZCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibGVhZmxlZ2VuZCIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJsZWFmbGVnZW5kIikNCn0NCmlmICghcmVxdWlyZSgiZ2VvanNvbmlvIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJnZW9qc29uaW8iKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiZ2VvanNvbmlvIikNCn0NCmlmICghcmVxdWlyZSgic3RyaW5naSIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygic3RyaW5naSIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJzdHJpbmdpIikNCn0NCmlmICghcmVxdWlyZSgiUkNvbG9yQnJld2VyIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJSQ29sb3JCcmV3ZXIiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiUkNvbG9yQnJld2VyIikNCn0NCmlmICghcmVxdWlyZSgidGlncmlzIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJ0aWdyaXMiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgidGlncmlzIikNCn0NCmlmICghcmVxdWlyZSgibGVhZnBvcCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibGVhZnBvcCIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJsZWFmcG9wIikNCn0NCmlmICghcmVxdWlyZSgibGVhZmVtIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJsZWFmZW0iKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgibGVhZmVtIikNCn0NCmlmICghcmVxdWlyZSgidG1hcCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygidG1hcCIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJ0bWFwIikNCn0NCmlmICghcmVxdWlyZSgidG1hcHRvb2xzIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJ0bWFwdG9vbHMiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgidG1hcHRvb2xzIikNCn0NCmlmICghcmVxdWlyZSgid2Vic2hvdDIiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoIndlYnNob3QyIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoIndlYnNob3QyIikNCn0NCmlmICghcmVxdWlyZSgic2YiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoInNmIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoInNmIikNCn0NCmlmICghcmVxdWlyZSgidGVycmEiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoInRlcnJhIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoInRlcnJhIikNCn0NCmlmICghcmVxdWlyZSgibGVhZnBvcCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibGVhZnBvcCIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJsZWFmcG9wIikNCn0NCg0KIyMNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFLCAgIA0KICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRSVUUsICAgDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBOQSkNCmBgYA0KDQojIERhdGEgUHJlcGFyYXRpb246IEdhcyBTdGF0aW9ucw0KDQpUaGUgZ2FzIHN0YXRpb24gZGF0YSBzZXQgd2FzIHVzZWQgZm9yIHRoZSBmaXJzdCBwYXJ0IG9mIHRoaXMgYW5hbHlzaXMuIEluIHRoZSBnYXMgc3RhdGlvbiBkYXRhIHNldCwgdGhlcmUgYXJlIDcyNzk4IG9ic2VydmF0aW9ucyBvZiAzMiB2YXJpYWJsZXMuIFNvbWUgdmFyaWFibGVzIGluY2x1ZGU6IHN0YXRlLCBjb3VudHksIGFkZHJlc3MsIGNvb3JkaW5hdGVzLCBkZXNjcmlwdGlvbiwgYWRkcmVzcywgYW5kIHBvaW50IG9mIGNvbXByb21pc2UgKFBPQykuDQoNClVzaW5nIHRoaXMgZGF0YSBzZXQsIGEgbmV3IGRhdGEgc2V0IHdhcyBjcmVhdGVkIGJ5IHJhbmRvbWx5IHNlbGVjdGluZyA1MDAgb2JzZXJ2YXRpb25zLiBUaGUgcmVzdWx0aW5nIGRhdGEgc2V0IHdhcyA1MDAgb2JzZXJ2YXRpb25zIG9mIGFsbCAzMiB2YXJpYWJsZXMuIA0KDQpgYGB7cn0NCg0KZ2FzIDwtIHJlYWQuY3N2KGZpbGU9Imh0dHBzOi8vaXNhcmVubi5naXRodWIuaW8vaXJlbm5lbmJlcmcvV2VlazcvUE9DLmNzdiIpICNyZWFkaW5nIGluIHRoZSBkYXRhc2V0IGZyb20gZ2l0aGJ1Yg0KDQpnYXMyIDwtZ2FzW3NhbXBsZShucm93KGdhcyksIHNpemU9NTAwKSxdICNHZXR0aW5nIGEgcmFuZG9tIHNhbXBsZQ0KDQoNCmBgYA0KDQojIEdhcyBTdGF0aW9uczogSW50ZXJhY3RpdmUgTWFwDQoNClVzaW5nIHRoZSBSIE1hcCBMaWJyYXJ5LCB0aGUgZm9sbG93aW5nIGludGVyYWN0aXZlIG1hcCBvZiB0aGUgZ2FzIHN0YXRpb24gZGF0YSB3YXMgY3JlYXRlZC4gVGhlIHBvcCB1cHMgaW5jbHVkZTogDQoNCiogKipTdGF0ZSoqDQoqICoqQ291bnR5KioNCiogKipBZGRyZXNzKioNCiogKipaaXAgQ29kZSoqDQoNCmBgYHtyIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLmhlaWdodD00LCBmaWcud2lkdGg9Nn0NCg0KbGFiZWwubXNnPC1wYXN0ZShwYXN0ZSgiU3RhdGUiLCBnYXMyJFNUQVRFKSwgcGFzdGUoIkNvdW50eSIsIGdhczIkY291bnR5KSwNCiAgICAgICAgICAgICAgICAgcGFzdGUoIkFkZHJlc3MiLCBnYXMyJEFERFJFU1MpLCBwYXN0ZSgiWmlwIiwgZ2FzMiRaSVBuZXcpKQ0KDQojIG1ha2luZyBzdGF0aWMgbGVhZmxldCBtYXANCmxlYWZsZXQoZ2FzMikgJT4lDQogIGFkZFRpbGVzKCkgJT4lIA0KICBzZXRWaWV3KGxuZz1tZWFuKGdhczIkeGNvb3JkKSwgbGF0PW1lYW4oZ2FzMiR5Y29vcmQpLCB6b29tID0gMTQpICU+JQ0KICAgYWRkUmVjdGFuZ2xlcygNCiAgICBsbmcxID0gbWluKGdhczIkeGNvb3JkKSwgbGF0MSA9IG1pbihnYXMyJHljb29yZCksDQogICAgbG5nMiA9IG1heChnYXMyJHhjb29yZCksIGxhdDIgPSBtYXgoZ2FzMiR5Y29vcmQpLA0KICAgIGZpbGxDb2xvciA9ICJ0cmFuc3BhcmVudCIgDQogICAgKSAlPiUNCiAgZml0Qm91bmRzKA0KICAgIGxuZzEgPSBtaW4oZ2FzMiR4Y29vcmQpLCBsYXQxID0gbWluKGdhczIkeWNvb3JkKSwNCiAgICBsbmcyID0gbWF4KGdhczIkeGNvb3JkKSwgbGF0MiA9IG1heChnYXMyJHljb29yZCkgKSAlPiUNCiAgYWRkTWFya2Vycyh+eGNvb3JkLCB+eWNvb3JkLCBsYWJlbCA9IH5sYWJlbC5tc2cpDQoNCmBgYA0KDQojIERhdGEgUHJlcGFydGlvbjogUGhpbGFkZWxwaGlhIENyaW1lIERhdGENCg0KQW5vdGhlciBkYXRhIHNldCB3YXMgdXNlZDogUGhpbGx5IENyaW1lIGRhdGEuIFRoaXMgZGF0YSBzZXQgc2hvd3MgbG9uZ2l0dWRpbmFsIGNyaW1lIGNhc2VzIHNpbmNlIDIwMTQuIFRoZXJlIGFyZSAxNTUyMCBvYnNlcnZhdGlvbnMgYW5kIDE4IHZhcmlhYmxlcyBpbiB0aGlzIGRhdGFzZXQuIA0KDQpGcm9tIHRoaXMgZGF0YSBzZXQsIHRoZSB5ZWFyIHdhcyBleHRyYWN0ZWQgZnJvbSB0aGUgZGF0ZSBhbmQgYSBuZXcgdmFyaWFibGUgInllYXIiIHdhcyBjcmVhdGVkLiANCg0KQWRkaXRpb25hbGx5LCBhIHN1YnNldCB3YXMgbWFkZSB3aXRoIG9ubHkgMjAyMyBkYXRhLiANCg0KYGBge3J9DQoNCmNyaW1lIDwtIHJlYWQuY3N2KGZpbGU9Imh0dHBzOi8vaXNhcmVubi5naXRodWIuaW8vaXJlbm5lbmJlcmcvV2VlazcvUGhpbGx5Q3JpbWVTaW5jZTIwMTUuY3N2IikgI3JlYWRpbmcgaW4gdGhlIGRhdGFzZXQgZnJvbSBnaXRoYnViDQoNCmNyaW1lJHllYXIgPC0gZm9ybWF0KGFzLkRhdGUoY3JpbWUkZGF0ZSwgZm9ybWF0PSIlbS8lZC8lWSAlSDolTSIpLCAiJVkiKQ0KDQpkMjAyM2NyaW1lIDwtIGNyaW1lICU+JQ0KICBmaWx0ZXIoeWVhcj09JzIwMjMnKQ0KDQpgYGANCg0KIyBQaGlsYWRlbHBoaWEgQ3JpbWU6IEludGVyYWN0aXZlIE1hcA0KDQpVc2luZyB0aGUgYWJvdmUgZGF0YSBzZXQsIHRoZSBmb2xsb3dpbmcgbWFwIHdhcyBjcmVhdGVkIHRvIHBsb3QgY3JpbWUgbG9jYXRpb25zLiBEaWZmZXJlbnQgY29sb3JzIHdlcmUgdXNlZCB0byBsYWJlbCBmYXRhbCBhbmQgbm9uIGZhdGFsIGNyaW1lcy4gDQoNClRoZSBob3ZlciBpbmNsdWRlZCB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOg0KDQoqICoqU2V4KioNCiogKipGYXRhbGl0eT8qKg0KKiAqKk5laWdoYm9yaG9vZCoqDQoqICoqUmFjZSoqDQoqICoqRGF0ZSoqDQoqICoqUG9saWNlIERpc3RyaWN0KioNCg0KYGBge3J9DQoNCm1hcF9vcHRpb25zIDwtIGxpc3QoDQogIHNjb3BlID0gJ3VzYScsDQogIHByb2plY3Rpb24gPSBsaXN0KHR5cGUgPSAncmVndWxhciB1c2EnKSwNCiAgc2hvd2xha2VzID0gVFJVRSwNCiAgbGFrZWNvbG9yID0gdG9SR0IoJ3doaXRlJykNCikNCg0KIyMjDQpwbG90X2dlbyhkMjAyM2NyaW1lLCBsYXQgPSB+bGF0LCBsb24gPSB+bG5nKSAlPiUgDQogIGFkZF9tYXJrZXJzKCB0ZXh0ID0gfnBhc3RlKHNleCwgZmF0YWwsIG5laWdoYm9yaG9vZCwgcmFjZSwgZGF0ZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUoIlBvbGljZSBEaXN0cmljdDoiLCBwb2xpY2VfZGlzdHJpY3QpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwID0gIjxicj4iKSwNCiAgICAgICAgICAgICAgY29sb3IgPSB+ZmF0YWwsIA0KICAgICAgICAgICAgICBzeW1ib2wgPSAiY2lyY2xlIiwgDQogICAgICAgICAgICAgIGhvdmVyaW5mbyA9ICJ0ZXh0IikgICAlPiUgDQogIGNvbG9yYmFyKHRpdGxlID0gIkZhdGFsaXR5PGJyPjIwMTEuMiIpICAlPiUgDQogIGxheW91dCggdGl0bGUgPSAnUGhpbGFkZWxwaGlhIENyaW1lIDIwMjMnLCAgZ2VvPWxpc3QoDQogICAgICBzY29wZSA9ICd1c2EnLA0KICAgICAgY2VudGVyPWxpc3QobGF0PTM5Ljk1MjU4MywgbG9uPS03NS4xNjUyMjIpLA0KICAgICAgcHJvamVjdGlvbiA9IGxpc3Qoc2NhbGUgPSAzMDApDQogICAgKQ0KICApDQoNCmBgYA0KRnJvbSB0aGUgbWFwLCB3ZSBjYW4gc2VlIHRoYXQgdGhlIG1ham9yaXR5IG9mIGNyaW1lcyB3ZXJlIG5vbiBmYXRhbC4gV2UgY2FuIGFsc28gc2VlIHRoYXQgdGhlcmUgd2VyZSB2ZXJ5IG1hbnkgY3JpbWVzIGluIDIwMjMuVGhlIGNyaW1lcyBhcmUgY2x1c3RlcmVkIGluIHRoZSBjZW50ZXItbW9zdCBwb3J0aW9uIG9mIHRoZSBjaXR5LCBhbmQgYXJlIGxlc3MgY29uZGVuc2VkIHRoZSBmYXJ0aGVyIGF3YXkgZnJvbSB0aGUgY2VudGVyIHlvdSBnby4gDQoNClRoYW5rIHlvdSENCg==